package com.kevecho.mqtt;

import org.eclipse.paho.client.mqttv3.*;
import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;

import java.io.IOException;
import java.util.Scanner;

public class AppSubscriber {
    private MqttClient client;
    private MqttTopic topic;
    private String serverTopic = "topic/machine";
    private String myTopic = "topic/machine/282738";

    public static void main( String[] args ) throws MqttException {
        Scanner input = new Scanner(System.in);
        AppSubscriber subscriber = new AppSubscriber();
        String val = null;       // 记录输入的字符串
        do{
            System.out.print("请输入：");
            val = input.next();       // 等待输入值
            System.out.println("您输入的是："+val);
            subscriber.publish(val);
        }while(!val.equals("#"));   // 如果输入的值不是#就继续输入
        System.out.println("你输入了\"#\"，程序已经退出！");
        input.close(); // 关闭资源
    }

    public AppSubscriber() throws MqttException {
        connect();
    }

    public void publish(String input) throws MqttException {
        MqttMessage message = new MqttMessage();
        message.setQos(1);
        message.setRetained(true);
        message.setPayload(input.getBytes());

        MqttDeliveryToken token = topic.publish(message);
        token.waitForCompletion();
    }

    private void connect() throws MqttException {
        //host为主机名，test为clientid即连接MQTT的客户端ID，一般以客户端唯一标识符表示，MemoryPersistence设置clientid的保存形式，默认为以内存保存
        client = new MqttClient("tcp://192.168.242.135:1883", "demo", new MemoryPersistence());

        //MQTT的连接设置
        MqttConnectOptions options = new MqttConnectOptions();
        //设置是否清空session,这里如果设置为false表示服务器会保留客户端的连接记录，这里设置为true表示每次连接到服务器都以新的身份连接
        options.setCleanSession(true);
        //设置连接的用户名
        options.setUserName("demo");
        //设置连接的密码
        options.setPassword("demo".toCharArray());
        // 设置超时时间 单位为秒
        options.setConnectionTimeout(10);
        // 设置会话心跳时间 单位为秒 服务器会每隔1.5*20秒的时间向客户端发送个消息判断客户端是否在线，但这个方法并没有重连的机制
        options.setKeepAliveInterval(20);
        //设置回调
        client.setCallback(new MqttCallback() {

            public void connectionLost(Throwable cause) {
                //连接丢失后，一般在这里面进行重连
                System.out.println("connectionLost----------");
            }

            public void deliveryComplete(IMqttDeliveryToken token) {
                //publish后会执行到这里
                System.out.println("deliveryComplete---------"
                        + token.isComplete());
            }

            public void messageArrived(String topicName, MqttMessage message)
                    throws Exception {
                System.out.println("messageArrived----------" + message.isRetained() + "," + new String(message.getPayload()));
            }
        });

        topic = client.getTopic(serverTopic);
        client.connect(options);
        client.subscribe(myTopic, 1);
    }
}
